package design.mode.singleton;

import java.util.concurrent.atomic.AtomicLong;

/**
 * 静态内部类u
 * @author ZhongMingde on 2021/10/25
 */

public class LazyStaticInnerClassSingleton {

    private AtomicLong id = new AtomicLong(0);


    /**
     * 如果LazyStaticInnerClassSingleton没有使用，则内部类是不会被加载的
     */
    private LazyStaticInnerClassSingleton(){
        if (SingletonHolder.instance != null) {// 避免反射破坏单例
            throw new RuntimeException("不允许创建多个实例！");// 此处抛出异常还是不够优雅，如果想更好的解决，可以使用枚举单例（推荐）
        }
    }

    /**
     * 注意，每个关键字都不是多余的，static是为了使单例模式的空间共享，保证这个方法不会被重写、重载
     */
    private static class SingletonHolder{
        private static final LazyStaticInnerClassSingleton instance = new LazyStaticInnerClassSingleton();
    }

    /**
     * <p>这种方式兼顾了饿汉式单例写法的内存浪费问题和synchronized的性能问题。内部类一定要在方法调用之前被初始化，巧妙地避免了线程安全问题。</p>
     *
     * @return
     */
    public static LazyStaticInnerClassSingleton getInstance(){
        // 在返回结果之前，一定会先加载内部类
        return SingletonHolder.instance;
    }

    public long getId(){
        return id.incrementAndGet();
    }
}
